#include<iostream>
#include<stdio.h>
#include<mutex>

class Singleton{
private:
  int _data;
private:
  static Singleton* _eton;   //volatile 保持内存可见性
  static std::mutex _mutex;  //定义一个锁类型
  Singleton() 
     {_data=100;}   //构造函数私有化
public:
  int get_data(){
    return _data; 
  }
  static Singleton* GetInstance(){
    if(_eton==NULL){    //二次检查，避免加锁导致的效率低
      _mutex.lock();  //加锁操作，保证线程安全，但是效率会降低
      if(_eton==NULL){
         _eton=new Singleton;
       }
      _mutex.unlock();
    }
   return _eton;
  }
};

std::mutex Singleton::_mutex;
Singleton* Singleton::_eton=nullptr;      //静态成员变量在类外定义

int main()
{
  Singleton* eton=Singleton::GetInstance();
  std::cout << eton->get_data() << std::endl;
  return 0;
}
